#include "Loguer.h"

Utilisateur *  gestion_identifier()
{
    /* Pointeurs sur Widgets */
    GtkWidget * pWindowLoguer=NULL;
    GtkWidget * pButton1;
    GtkWidget * pButton2;
    GtkWidget * pButton3;
    GtkWidget * pTable1;
    GList * pList = NULL ;
    Utilisateur *u=NULL;
    GtkWidget * pLabel;

    /*Creation de la fenêtre principale*/
    pWindowLoguer=gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(pWindowLoguer), "Identification");
    gtk_window_set_default_size(GTK_WINDOW(pWindowLoguer), 300,300);
    gtk_window_set_position(GTK_WINDOW(pWindowLoguer), GTK_WIN_POS_MOUSE);

    /* Creation de la table */
    pTable1 = gtk_table_new(4,1, TRUE);

    /* Insertion de la table dans la fenêtre principale */
    gtk_container_add(GTK_CONTAINER(pWindowLoguer), GTK_WIDGET(pTable1));

    /* Création des Boutons */
    pButton1=gtk_button_new_with_mnemonic("_S'identifier");
    pButton2=gtk_button_new_with_mnemonic("_Nouvel utilisateur");
    pButton3=gtk_button_new_with_mnemonic("_Supprimer un utilisateur");

    /* Création du label */
    pLabel=gtk_label_new("");

    /* Insertion des éléments dans la table */
    gtk_table_attach_defaults(GTK_TABLE(pTable1), pButton1,0,1,0,1);
    gtk_table_attach_defaults(GTK_TABLE(pTable1), pButton2,0,1,1,2);
    gtk_table_attach_defaults(GTK_TABLE(pTable1), pButton3,0,1,2,3);
    gtk_table_attach_defaults(GTK_TABLE(pTable1), pLabel,0,1,3,4);

    /* On remplit la liste pour les fonctions gérant les évènements des boutons  */
    pList=g_list_append(pList, (gpointer)pLabel);
    pList=g_list_append(pList, (gpointer)pWindowLoguer);
    pList=g_list_append(pList, (gpointer)&u);

    /* Gestion des évènements */
    g_signal_connect(G_OBJECT(pWindowLoguer), "destroy", G_CALLBACK(gestion_quitter_identification), NULL);
    g_signal_connect(G_OBJECT(pButton1), "clicked", G_CALLBACK(gestion_loguer), pList);
    g_signal_connect(G_OBJECT(pButton2), "clicked", G_CALLBACK(gestion_nouvel_utilisateur), pList);
    g_signal_connect(G_OBJECT(pButton3), "clicked", G_CALLBACK(gestion_supprimer_utilisateur), pList);

//    printf("voici u=%p &u=%p\n", u, &u);
    if(u!=NULL)
    {
//        printf("voici le quatrième elt de la liste dans la fonction gestion_loguer: \n");
//        utilisateurAfficher(u);
//        gtk_main_quit();
        return (u);
    }

    /* Affichage */
    gtk_widget_show_all(pWindowLoguer);

    /* Boucle évènementielle */
    gtk_main();

    /* On libère la list */
    g_list_free(pList);

    return u;

}


void gestion_quitter_identification(GtkWidget * widget, GList * data)
{
    etat_identification=2;
    gtk_main_quit();
}


void gestion_loguer(GtkWidget * widget, GList * data)
{
//    printf("voici la longueur de la liste: %d: \n", g_list_length(data));

    /* Variables */
    GtkWidget* pBoite;
    GtkWidget* pLabel1;
    GtkWidget* pLabel2;
    GtkWidget* pEntry1;
    GtkWidget* pEntry2;
    Utilisateur ** u;
    GtkWidget * pWindowLoguer;
    GtkWidget * pLabel;

    /* On récupère les elts de la liste*/
    pLabel=(GtkWidget*)g_list_nth_data(data, 0);
    pWindowLoguer=(GtkWidget*)g_list_nth_data(data, 1);
    u=(Utilisateur **)g_list_nth_data(data, 2);

//    printf("gestion_loguer u=%p\n", *u);

    /*On charge le fichier de l'ensemble des utilisateurs*/
    EnsUtilisateur e1;
    ensutInitialiser(&e1);
    ensutCharger(&e1, "EnsembleUtilisateur");

    /* On utilisse un utilisateur tampon */
    Utilisateur * u1;
//    utilisateurInitialiser(&u1);

    /* Creation de la boite de dialogue */
    /* 1 bouton Valider */
    /* 1 bouton Annuler */
    pBoite = gtk_dialog_new_with_buttons("Identification",
        GTK_WINDOW(pWindowLoguer),
        GTK_DIALOG_MODAL,
        GTK_STOCK_OK,GTK_RESPONSE_OK,
        GTK_STOCK_CANCEL,GTK_RESPONSE_CANCEL,
        NULL);

    /* Création des labels */
    pLabel1=gtk_label_new("Nom:");
    pLabel2=gtk_label_new("Mot de passe:");

    /* Creation des zones de saisie */
    pEntry1=gtk_entry_new();
    gtk_entry_set_visibility(GTK_ENTRY(pEntry1), TRUE);

    pEntry2=gtk_entry_new();
    gtk_entry_set_visibility(GTK_ENTRY(pEntry2), FALSE);

    /* Insertion de la zone de saisie dans la boite de dialogue */
    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(pBoite)->vbox), pLabel1, TRUE, FALSE, 0);
    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(pBoite)->vbox), pEntry1, TRUE, FALSE, 0);
    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(pBoite)->vbox), pLabel2, TRUE, FALSE, 0);
    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(pBoite)->vbox), pEntry2, TRUE, FALSE, 0);

    /* Variable pour la boite de dialogue */
    const gchar * notification;
    const gchar * nom;
    const gchar * password;

    /* Affichage des elements de la boite de dialogue */
    gtk_widget_show_all(GTK_DIALOG(pBoite)->vbox);

    /* On lance la boite de dialogue et on recupere la reponse */
    switch (gtk_dialog_run(GTK_DIALOG(pBoite)))
    {
        /* L utilisateur valide */
        case GTK_RESPONSE_OK:
            /* On récupère le nom de l'utilisateur */
            //const gchar * nom;
            nom = gtk_entry_get_text(GTK_ENTRY(pEntry1));

            /* On récupère le mot de passe de l'utilisateur */
            //const gchar * password;
            password = gtk_entry_get_text(GTK_ENTRY(pEntry2));

            /* On regarde si la liste d'utilisateur contient le meme nom que celui entré par l'utilisateur, et on vérifie le mot de passe */
            u1 = ensutRechercher(&e1,(char *)nom);

            if (u1==NULL)
            {
                notification = "Vous n'etes pas encore enregistré dans la base de donnée";
                *u=NULL;
                gtk_label_set_text(GTK_LABEL(pLabel), notification);
            }
            else if (strcmp(password, utilisateurGetPassword(u1))!=0)
            {
                notification= "Votre mot de passe n'est pas valide";
                *u=NULL;
                gtk_label_set_text(GTK_LABEL(pLabel), notification);
            }
            else
            {
                *u=u1;
//                printf("gestion_loguer u=%p\n", *u);
//                utilisateurAfficher(u);
//                notification= "Vous pouvez maintenant utiliser RSACrypt";
                gtk_widget_destroy(pWindowLoguer);
            }
            break;
        /* L utilisateur annule */
        case GTK_RESPONSE_CANCEL:
        case GTK_RESPONSE_NONE:
        default:
            gtk_label_set_text(GTK_LABEL(pLabel), "Vous n'avez rien saisi !");
            break;
    }

     /* Destruction de la boite de dialogue */
     gtk_widget_destroy(pBoite);
}


void gestion_nouvel_utilisateur(GtkWidget * widget, GList * data)
{
    /* Variables */
    GtkWidget* pBoite;
    GtkWidget* pLabel1;
    GtkWidget* pLabel2;
    GtkWidget* pLabel3;
    GtkWidget* pEntry1;
    GtkWidget* pEntry2;
    GtkWidget* pEntry3;
    GtkWidget * pWindowLoguer;
    GtkWidget * pLabel;

    /* On récupère les elts de la liste*/
    pLabel=(GtkWidget*)g_list_nth_data(data, 0);
    pWindowLoguer=(GtkWidget*)g_list_nth_data(data, 1);

    /*On charge le fichier de l'ensemble des utilisateurs*/
    EnsUtilisateur e1;
    ensutInitialiser(&e1);
    ensutCharger(&e1, "EnsembleUtilisateur");

    /* On crée l'agenda de cet utilisateur */
    Agenda a1;
    agendaInitialiser(&a1);
    char nomagenda[30];
    strcpy(nomagenda,"agenda");

    /* On crée le nouvelle utilisateur */
    Utilisateur * u1;

    /* Creation de la boite de dialogue */
    /* 1 bouton Valider */
    /* 1 bouton Annuler */
    pBoite = gtk_dialog_new_with_buttons("Nouvelle utilisateur",
        GTK_WINDOW(pWindowLoguer),
        GTK_DIALOG_MODAL,
        GTK_STOCK_OK,GTK_RESPONSE_OK,
        GTK_STOCK_CANCEL,GTK_RESPONSE_CANCEL,
        NULL);

    /* Création des labels */
    pLabel1=gtk_label_new("Nom:");
    pLabel2=gtk_label_new("Prenom:");
    pLabel3=gtk_label_new("Mot de passe:");

    /* Creation des zones de saisie */
    pEntry1=gtk_entry_new();
    gtk_entry_set_visibility(GTK_ENTRY(pEntry1), TRUE);

    pEntry2=gtk_entry_new();
    gtk_entry_set_visibility(GTK_ENTRY(pEntry2), TRUE);

    pEntry3=gtk_entry_new();
    gtk_entry_set_visibility(GTK_ENTRY(pEntry3), FALSE);

    /* Insertion de la zone de saisie dans la boite de dialogue */
    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(pBoite)->vbox), pLabel1, TRUE, FALSE, 0);
    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(pBoite)->vbox), pEntry1, TRUE, FALSE, 0);
    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(pBoite)->vbox), pLabel2, TRUE, FALSE, 0);
    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(pBoite)->vbox), pEntry2, TRUE, FALSE, 0);
    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(pBoite)->vbox), pLabel3, TRUE, FALSE, 0);
    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(pBoite)->vbox), pEntry3, TRUE, FALSE, 0);

    /* Affichage des elements de la boite de dialogue */
    gtk_widget_show_all(GTK_DIALOG(pBoite)->vbox);

    /* On lance la boite de dialogue et on recupere la reponse */
    switch (gtk_dialog_run(GTK_DIALOG(pBoite)))
    {
        /* L utilisateur valide */
        case GTK_RESPONSE_OK:
            utilisateurInitialiser(&u1);
            utilisateurSetNom(u1, (char *)gtk_entry_get_text(GTK_ENTRY(pEntry1)));
            utilisateurSetPrenom(u1, (char *)gtk_entry_get_text(GTK_ENTRY(pEntry2)));
            utilisateurSetPassword(u1, (char *)gtk_entry_get_text(GTK_ENTRY(pEntry3)));
            utilisateurCreerClefPublique(u1);
            utilisateurCreerClefPrivee(u1);
            ensutAjouter(&e1,u1);
            ensutSauver(&e1, "EnsembleUtilisateur");
            strcat(nomagenda ,utilisateurGetNom(u1));
            agendaSauver(&a1, nomagenda);
            gtk_label_set_text(GTK_LABEL(pLabel), "Vous pouvez maintenant vous loguer");
            break;
        /* L utilisateur annule */
        case GTK_RESPONSE_CANCEL:
        case GTK_RESPONSE_NONE:
        default:
            gtk_label_set_text(GTK_LABEL(pLabel), "Vous n'avez rien saisi !");
            break;
    }

    /* Destruction de la boite de dialogue */
    gtk_widget_destroy(pBoite);
}


void gestion_supprimer_utilisateur(GtkWidget * widget, GList * data)
{
    /* Variables */
    GtkWidget* pBoite;
    GtkWidget* pLabel1;
    GtkWidget* pLabel2;
    GtkWidget* pLabel3;
    GtkWidget* pEntry1;
    GtkWidget* pEntry2;
    GtkWidget* pEntry3;
    Utilisateur * u;
    GtkWidget * pWindowLoguer;
    GtkWidget * pLabel;

    /* On récupère les elts de la liste*/
    pLabel=(GtkWidget*)g_list_nth_data(data, 0);
    pWindowLoguer=(GtkWidget*)g_list_nth_data(data, 1);
    u=(Utilisateur *)g_list_nth_data(data,2);

    /*On charge le fichier de l'ensemble des utilisateurs*/
    EnsUtilisateur e1;
    ensutInitialiser(&e1);
    ensutCharger(&e1, "EnsembleUtilisateur");

    /* Creation de la boite de dialogue */
    /* 1 bouton Valider */
    /* 1 bouton Annuler */
    pBoite = gtk_dialog_new_with_buttons("Nouvelle utilisateur",
        GTK_WINDOW(pWindowLoguer),
        GTK_DIALOG_MODAL,
        GTK_STOCK_OK,GTK_RESPONSE_OK,
        GTK_STOCK_CANCEL,GTK_RESPONSE_CANCEL,
        NULL);

    /* Création des labels */
    pLabel1=gtk_label_new("Nom:");
    pLabel2=gtk_label_new("Mot de passe");
    pLabel3=gtk_label_new("Confirmation mot de passe:");

    /* Creation des zones de saisie */
    pEntry1=gtk_entry_new();
    gtk_entry_set_visibility(GTK_ENTRY(pEntry1), TRUE);

    pEntry2=gtk_entry_new();
    gtk_entry_set_visibility(GTK_ENTRY(pEntry2), FALSE);

    pEntry3=gtk_entry_new();
    gtk_entry_set_visibility(GTK_ENTRY(pEntry3), FALSE);

    /* Insertion de la zone de saisie dans la boite de dialogue */
    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(pBoite)->vbox), pLabel1, TRUE, FALSE, 0);
    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(pBoite)->vbox), pEntry1, TRUE, FALSE, 0);
    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(pBoite)->vbox), pLabel2, TRUE, FALSE, 0);
    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(pBoite)->vbox), pEntry2, TRUE, FALSE, 0);
    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(pBoite)->vbox), pLabel3, TRUE, FALSE, 0);
    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(pBoite)->vbox), pEntry3, TRUE, FALSE, 0);

    /* Affichage des elements de la boite de dialogue */
    gtk_widget_show_all(GTK_DIALOG(pBoite)->vbox);

    /* On récupère les nom et mots de passe saisis par l'utilisateur */
    char * password1;
    char * password2;
    char * password3;

    /* On lance la boite de dialogue et on recupere la reponse */
    switch (gtk_dialog_run(GTK_DIALOG(pBoite)))
    {
        /* L utilisateur valide */
        case GTK_RESPONSE_OK:
            u=ensutRechercher(&e1,(char *)gtk_entry_get_text(GTK_ENTRY(pEntry1)));
            password1=(char *)gtk_entry_get_text(GTK_ENTRY(pEntry2));
            password2=(char *)gtk_entry_get_text(GTK_ENTRY(pEntry3));
            if (u!=NULL)
            {
                password3= utilisateurGetPassword(u);
            }

            if (strcmp(password1, password2)!=0)
            {
                gtk_label_set_text(GTK_LABEL(pLabel), "Vous avez rentré deux mot de passe différents");
            }
            else if(u==NULL)
            {
                gtk_label_set_text(GTK_LABEL(pLabel), "Vous n'etes pas enregistré dans la base des utilisateurs");
            }
            else if(strcmp(password1, password3)!=0)
            {
                gtk_label_set_text(GTK_LABEL(pLabel), "Le mot de passe saisie n'est pas le bon");
            }
            else
            {
                ensutSupprimer(&e1, (char *)gtk_entry_get_text(GTK_ENTRY(pEntry1)));
                ensutSauver(&e1, "EnsembleUtilisateur");
                gtk_label_set_text(GTK_LABEL(pLabel), "L'utilisateur a bien été supprimé");
            }
            u=NULL;
            break;
        /* L utilisateur annule */
        case GTK_RESPONSE_CANCEL:
        case GTK_RESPONSE_NONE:
        default:
            gtk_label_set_text(GTK_LABEL(pLabel), "Vous n'avez rien saisi !");
            break;
    }

    /* Destruction de la boite de dialogue */
    gtk_widget_destroy(pBoite);
}

